﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ConsoleApplication1
{
    public class Celda
    {
        int x;
        int y;
        int z;
        int costoUp;
        int costoDown;
        int costoLeft;
        int costoRight;
        int costoFront;       
        int costoBack;
        bool exploradoUp;
        bool exploradoDown;
        bool exploradoLeft;
        bool exploradoRight;
        bool exploradoFront;
        bool exploradoBack;
        List<bool> restrMovsInverso;
        Robot robotCelda;
        Int64[] sumColores;

        public Int64[] SumColores
        {
            get { return sumColores; }
            set { sumColores = value; }
        }
        int numColores;

        public int NumColores
        {
            get { return numColores; }
            set { numColores = value; }
        }

        public Robot RobotCelda
        {
            get { return robotCelda; }
            set { robotCelda = value; }
        }

        public List<bool> RestrMovsInverso
        {
            get { return restrMovsInverso; }
            set { restrMovsInverso = value; }
        }
        bool moverRight;
        bool moverLeft;
        bool moverUp;
        bool moverDown;
        bool moverFront;
        bool moverBack;
        bool robotInHere;
        //bool[,,] moverParedes = new bool[3, 3,3];
        Celda predecesorUp;
        Celda predecesorDown;
        Celda predecesorLeft;
        Celda predecesorRight;
        Celda predecesorFront;
        Celda predecesorBack;

       
        List<int[]> coloresRespuesta;
        int[] colorFinal;

        
        
        ///Si son muy poblados por robots los mapas convendrá hacer que cada celda tenga su rutaMin a cada salida, 
        ///pq es solo tomar la rutaMin del predecesor y agregar el predecesor.  El problema de esto es que podría gastar recursos demás.
        ///Para laberintos poco densos (poco poblados) se opta por solo guardar su predecesor y luego por cada robot armar su ruta en base a predecesores
        //List<Celda> rutaMinUp;
        //List<Celda> rutaMinDown;
        //List<Celda> rutaMinLeft;
        //List<Celda> rutaMinRight;
        

        public Celda(int x_, int y_, int z_)
        {
            /*for (int i=0; i<3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    for (int k = 0; k < 3;k++ )
                        moverParedes[i, j,k] = true;
                }
            }*/
            //moverParedes[0, 1,0] = true;
            sumColores = new Int64[]{ 0,0,0};
            numColores = 0;
            x = x_;
            y = y_;
            z = z_;
            costoUp = int.MaxValue;
            costoDown = int.MaxValue;
            costoLeft = int.MaxValue;
            costoRight = int.MaxValue;
            costoFront = int.MaxValue;
            costoBack = int.MaxValue;
            MoverRight = true;
            MoverLeft = true;
            MoverUp = true;
            MoverDown = true;
            MoverFront = true;
            MoverBack = true;
            restrMovsInverso = new List<bool>();
            restrMovsInverso.Add(moverDown);
            restrMovsInverso.Add(moverLeft);
            restrMovsInverso.Add(moverFront);
            restrMovsInverso.Add(moverRight);
            restrMovsInverso.Add(moverBack);
            restrMovsInverso.Add(moverUp);
            ColoresRespuesta = new List<int[]>();
            ColorFinal = new int[] {0,0,0};
            RobotInHere = false;


            //rutaMinUp = new List<Celda>();
            //rutaMinDown = new List<Celda>();
            //rutaMinLeft = new List<Celda>();
            //rutaMinRight = new List<Celda>();
            exploradoUp = false;
            exploradoDown = false;
            exploradoLeft = false;
            exploradoRight = false;
            exploradoFront = false;
            exploradoBack = false;
            predecesorUp = null;
            predecesorDown = null;
            predecesorLeft = null;
            predecesorRight = null;
            predecesorFront = null;
            predecesorBack = null;
            robotCelda = null;

        }

        #region Getters y Setters
        public int X
        {
            get { return x; }
            set { x = value; }
        }
       
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
        public int Z
        {
            get { return z; }
            set { z = value; }
        }
        public bool MoverFront
        {
            get { return moverFront; }
            set { moverFront = value; }
        }
        public int CostoFront
        {
            get { return costoFront; }
            set { costoFront = value; }
        }
        public int CostoBack
        {
            get { return costoBack; }
            set { costoBack = value; }
        }
        public int CostoUp
        {
            get { return costoUp; }
            set { costoUp = value; }
        }
        public int CostoDown
        {
            get { return costoDown; }
            set { costoDown = value; }
        }
        public int CostoLeft
        {
            get { return costoLeft; }
            set { costoLeft = value; }
        }
        public int CostoRight
        {
            get { return costoRight; }
            set { costoRight = value; }
        }
        public bool ExploradoUp
        {
            get { return exploradoUp; }
            set { exploradoUp = value; }
        }

        public bool ExploradoDown
        {
            get { return exploradoDown; }
            set { exploradoDown = value; }
        }

        public bool ExploradoLeft
        {
            get { return exploradoLeft; }
            set { exploradoLeft = value; }
        }

        public bool ExploradoRight
        {
            get { return exploradoRight; }
            set { exploradoRight = value; }
        }

        public bool ExploradoFront
        {
            get { return exploradoFront; }
            set { exploradoFront = value; }
        }

        public bool ExploradoBack
        {
            get { return exploradoBack; }
            set { exploradoBack = value; }
        }

        public bool MoverRight
        {
            get { return moverRight; }
            set { moverRight = value; }
        }
        public bool MoverBack
        {
            get { return moverBack; }
            set { moverBack = value; }
        }
     
        public bool MoverLeft
        {
            get { return moverLeft; }
            set { moverLeft = value; }
        }
        
        public bool MoverUp
        {
            get { return moverUp; }
            set { moverUp = value; }
        }
        
        public bool MoverDown
        {
            get { return moverDown; }
            set { moverDown = value; }
        }
        
        public Celda PredecesorUp
        {
            get { return predecesorUp; }
            set { predecesorUp = value; }
        }
        
        public Celda PredecesorDown
        {
            get { return predecesorDown; }
            set { predecesorDown = value; }
        }
        public Celda PredecesorFront
        {
            get { return predecesorFront; }
            set { predecesorFront = value; }
        }


        public Celda PredecesorBack
        {
            get { return predecesorBack; }
            set { predecesorBack = value; }
        }
        
        public Celda PredecesorLeft
        {
            get { return predecesorLeft; }
            set { predecesorLeft = value; }
        }
        
        public Celda PredecesorRight
        {
            get { return predecesorRight; }
            set { predecesorRight = value; }
        }
        public List<int[]> ColoresRespuesta
        {
            get { return coloresRespuesta; }
            set { coloresRespuesta = value; }
        }
        public int[] ColorFinal
        {
            get { return colorFinal; }
            set { colorFinal = value; }
        }
        public bool RobotInHere
        {
            get { return robotInHere; }
            set { robotInHere = value; }
        }

        /*public bool[,,] MoverParedes
        {
            get { return moverParedes; }
            set { moverParedes = value; }
        }*/
#endregion
 
    }
}
